#ifndef DTU_COMMON_H
#define DTU_COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "dtu_types.h"

/* 版本信息 */
#define DTU_VERSION_MAJOR    1
#define DTU_VERSION_MINOR    0
#define DTU_VERSION_PATCH    0
#define DTU_VERSION_STRING   "1.0.0"

/* 设备型号定义 */
typedef enum {
    DTU_MODEL_ETHERNET_ONLY = 1,    /* 纯网口版本 */
    DTU_MODEL_WIFI_ETHERNET = 2,    /* WiFi+网口版本 */
    DTU_MODEL_4G_ETHERNET = 3       /* 4G+网口版本 */
} dtu_model_t;

/* 网络类型定义 */
typedef enum {
    NETWORK_TYPE_ETHERNET = 0,
    NETWORK_TYPE_WIFI = 1,
    NETWORK_TYPE_4G = 2
} network_type_t;

/* 网络状态定义 */
typedef enum {
    NETWORK_STATUS_DISCONNECTED = 0,
    NETWORK_STATUS_CONNECTING = 1,
    NETWORK_STATUS_CONNECTED = 2,
    NETWORK_STATUS_ERROR = 3
} network_status_t;



/* 串口参数结构 */
typedef struct {
    char device[64];        /* 串口设备路径 */
    int baudrate;          /* 波特率 */
    int databits;          /* 数据位 */
    int stopbits;          /* 停止位 */
    char parity;           /* 校验位: N-无, E-偶, O-奇 */
    int timeout;           /* 超时时间(ms) */
} serial_config_t;

/* 网络配置结构 */
typedef struct {
    bool dhcp_enable;      /* 是否启用DHCP */
    char ip[16];          /* IP地址 */
    char netmask[16];     /* 子网掩码 */
    char gateway[16];     /* 网关 */
    char dns1[16];        /* 主DNS */
    char dns2[16];        /* 备DNS */
} network_config_t;

/* WiFi配置结构 */
typedef struct {
    char ssid[64];        /* WiFi名称 */
    char password[64];    /* WiFi密码 */
    int security_type;    /* 安全类型 */
} wifi_config_t;

/* 4G配置结构 */
typedef struct {
    char apn[64];         /* APN */
    char username[64];    /* 用户名 */
    char password[64];    /* 密码 */
    int pin_code;         /* PIN码 */
} lte_config_t;

/* MQTT配置结构 */
typedef struct {
    char broker[128];     /* MQTT服务器地址 */
    int port;            /* MQTT服务器端口 */
    char client_id[256]; /* 客户端ID - 增大以支持长ID */
    char username[128];  /* 用户名 - 增大以支持长用户名 */
    char password[128];  /* 密码 - 增大以支持长密码 */
    char topic_prefix[128]; /* Topic前缀 */
    int keepalive;       /* 心跳间隔 */
    bool clean_session;  /* 清除会话 */
} mqtt_config_t;

/* MQTT订阅配置结构 */
typedef struct {
    char topic[256];     /* 订阅主题 */
    int qos;            /* QoS级别 */
} mqtt_subscribe_config_t;

/* 数据采集配置结构 */
typedef struct {
    int interval;        /* 采集间隔(秒) */
    bool auto_collect;   /* 自动采集开关 */
    int retry_count;     /* 重试次数 */
    int retry_interval;  /* 重试间隔(秒) */
} collect_config_t;

/* 设备信息结构 */
typedef struct {
    char device_id[32];   /* 设备ID */
    char serial_number[32]; /* 序列号 */
    dtu_model_t model;    /* 设备型号 */
    char firmware_version[16]; /* 固件版本 */
    char hardware_version[16]; /* 硬件版本 */
    char build_version[32]; /* 编译版本: ethernet/wifi/4g */
    time_t manufacture_date;   /* 生产日期 */
} device_info_t;

/* 系统状态结构 */
typedef struct {
    bool system_running;     /* 系统运行状态 */
    network_status_t network_status[3]; /* 各网络状态 */
    time_t uptime;          /* 运行时间 */
    uint32_t data_sent;     /* 已发送数据量 */
    uint32_t data_received; /* 已接收数据量 */
    uint32_t error_count;   /* 错误计数 */
} system_status_t;

/* 错误码定义 */
typedef enum {
    DTU_OK = 0,
    DTU_ERROR = -1,
    DTU_ERROR_INVALID_PARAM = -2,
    DTU_ERROR_MEMORY = -3,
    DTU_ERROR_NETWORK = -4,
    DTU_ERROR_TIMEOUT = -5,
    DTU_ERROR_NOT_FOUND = -6,
    DTU_ERROR_PERMISSION = -7,
    DTU_ERROR_BUSY = -8,
    DTU_ERROR_NOT_SUPPORTED = -9,
    DTU_ERROR_IO = -10,
    DTU_ERROR_PROTOCOL = -11,
    DTU_ERROR_CHECKSUM = -12,
    DTU_ERROR_OVERFLOW = -13,
    DTU_ERROR_UNDERFLOW = -14
} dtu_error_t;

/* 日志级别定义 */
typedef enum {
    LOG_LEVEL_DEBUG = 0,
    LOG_LEVEL_INFO = 1,
    LOG_LEVEL_WARN = 2,
    LOG_LEVEL_ERROR = 3,
    LOG_LEVEL_FATAL = 4
} log_level_t;

/* 常用宏定义 */
#define DTU_MAX_BUFFER_SIZE     4096
#define DTU_MAX_PATH_LENGTH     256
#define DTU_MAX_STRING_LENGTH   128
#define DTU_CONFIG_FILE_PATH    "config/dtu_config.ini"
#define DTU_LOG_FILE_PATH       "/var/log/dtu.log"
#define DTU_WEB_PORT           10020
#define DTU_MQTT_DEFAULT_PORT  1883

/* 内存管理宏 */
#define DTU_MALLOC(size)        dtu_malloc(size, __FILE__, __LINE__)
#define DTU_FREE(ptr)           dtu_free(ptr, __FILE__, __LINE__)
#define DTU_CALLOC(count, size) dtu_calloc(count, size, __FILE__, __LINE__)
#define DTU_REALLOC(ptr, size)  dtu_realloc(ptr, size, __FILE__, __LINE__)

/* 字符串安全操作宏 */
#define DTU_STRNCPY(dst, src, size) do { \
    strncpy(dst, src, size - 1); \
    dst[size - 1] = '\0'; \
} while(0)

#define DTU_SNPRINTF(dst, size, fmt, ...) do { \
    snprintf(dst, size, fmt, ##__VA_ARGS__); \
    dst[size - 1] = '\0'; \
} while(0)

/* 数组大小宏 */
#define DTU_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

/* 最小最大值宏 */
#define DTU_MIN(a, b) ((a) < (b) ? (a) : (b))
#define DTU_MAX(a, b) ((a) > (b) ? (a) : (b))

/* 位操作宏 */
#define DTU_SET_BIT(value, bit)     ((value) |= (1 << (bit)))
#define DTU_CLEAR_BIT(value, bit)   ((value) &= ~(1 << (bit)))
#define DTU_TOGGLE_BIT(value, bit)  ((value) ^= (1 << (bit)))
#define DTU_TEST_BIT(value, bit)    (((value) >> (bit)) & 1)

/* 时间相关宏 */
#define DTU_MSEC_TO_SEC(ms)     ((ms) / 1000)
#define DTU_SEC_TO_MSEC(sec)    ((sec) * 1000)
#define DTU_USEC_TO_MSEC(us)    ((us) / 1000)
#define DTU_MSEC_TO_USEC(ms)    ((ms) * 1000)

/* 全局变量声明 */
extern device_info_t g_device_info;
extern system_status_t g_system_status;

/* 函数声明 */
void* dtu_malloc(size_t size, const char* file, int line);
void dtu_free(void* ptr, const char* file, int line);
void* dtu_calloc(size_t count, size_t size, const char* file, int line);
void* dtu_realloc(void* ptr, size_t size, const char* file, int line);

const char* dtu_error_string(dtu_error_t error);
const char* dtu_network_type_string(network_type_t type);
const char* dtu_network_status_string(network_status_t status);

#endif /* DTU_COMMON_H */
